<!DOCTYPE HTML>
<html lang="en" class="light" dir="ltr">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>Dangerise&#x27;s Blog</title>
        <meta name="robots" content="noindex">


        <!-- Custom HTML head -->
        
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff">

        <link rel="icon" href="favicon.svg">
        <link rel="shortcut icon" href="favicon.png">
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->

    </head>
    <body class="sidebar-visible no-js">
    <div id="body-container">
        <!-- Provide site root to javascript -->
        <script>
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script>
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script>
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('light')
            html.classList.add(theme);
            var body = document.querySelector('body');
            body.classList.remove('no-js')
            body.classList.add('js');
        </script>

        <input type="checkbox" id="sidebar-toggle-anchor" class="hidden">

        <!-- Hide / unhide sidebar before it is displayed -->
        <script>
            var body = document.querySelector('body');
            var sidebar = null;
            var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            } else {
                sidebar = 'hidden';
            }
            sidebar_toggle.checked = sidebar === 'visible';
            body.classList.remove('sidebar-visible');
            body.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item expanded affix "><a href="articles/rust-aur/index.html">Rust AUR打包教程</a></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                <div class="sidebar-resize-indicator"></div>
            </div>
        </nav>

        <!-- Track and set sidebar scroll position -->
        <script>
            var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
            sidebarScrollbox.addEventListener('click', function(e) {
                if (e.target.tagName === 'A') {
                    sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
                }
            }, { passive: true });
            var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
            sessionStorage.removeItem('sidebar-scroll');
            if (sidebarScrollTop) {
                // preserve sidebar scroll position when navigating via links within sidebar
                sidebarScrollbox.scrollTop = sidebarScrollTop;
            } else {
                // scroll sidebar to current active section when navigating via "next/previous chapter" buttons
                var activeSection = document.querySelector('#sidebar .active');
                if (activeSection) {
                    activeSection.scrollIntoView({ block: 'center' });
                }
            }
        </script>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky">
                    <div class="left-buttons">
                        <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </label>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">Dangerise&#x27;s Blog</h1>

                    <div class="right-buttons">
                        <a href="print.html" title="Print this book" aria-label="Print this book">
                            <i id="print-button" class="fa fa-print"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script>
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="前言"><a class="header" href="#前言">前言</a></h1>
<p>众所周知，我们Arch系用户快乐感的来源除了neofetch，还有一个米奇妙妙屋——AUR</p>
<p>AUR丰富的软件生态与AUR helper带来的一键安装方式，使我最终决定使用Arch系的发行版</p>
<p>当你尝试为linux构建了一个软件之后，第一个想的肯定是将它上传到AUR，虽然打包到AUR有些繁琐，但是Rust强大的工具链使之轻而易举。（R门！）</p>
<p>笔者也是刚刚了解如何上传到AUR，如有缺漏，错误，烦请指出</p>
<p>以下将指导你将Rust包发布到AUR上</p>
<h1 id="准备工作"><a class="header" href="#准备工作">准备工作</a></h1>
<h2 id="注册账号"><a class="header" href="#注册账号">注册账号</a></h2>
<p>显然，你首先得有一个AUR账号 打开<a href="https://aur.archlinux.org/">AUR的网站</a>，注册一个账号</p>
<p><img src="articles/rust-aur/articles/rust-aur/AUR_home_page.png" alt="AUR 首页" /></p>
<p>创建账号的时候，你只需要填用户名和邮箱地址，然后在最底下的验证填上那些命令的输出，最后点击创建即可</p>
<p><img src="articles/rust-aur/articles/rust-aur/AUR_reg_page.png" alt="AUR 注册帐号" /></p>
<p>然后你的邮箱会收到一封来自AUR的邮件，你可以通过这个邮件为你的账号添加密码</p>
<p>账号创建成功后，通过这个账号登录到AUR</p>
<h2 id="ssh公钥"><a class="header" href="#ssh公钥">SSH公钥</a></h2>
<p>我们注意到，在创建账号的页面，有SSH公钥一栏，为了上传软件包，我们需要一个SSH公钥</p>
<p>我们先检查本机是否存在SSH公钥</p>
<pre><code>cd ~/.ssh
ls
</code></pre>
<p>我们先进入到这个目录，并查看是否存在id_rsa和id_rsa.pub文件，如果已经存在，就不需要创建</p>
<p>如果不存在，那便需要手动创建SSH key</p>
<pre><code>ssh-keygen -t rsa -C &quot;xxx@xxx.com&quot;
</code></pre>
<p>其中-C参数的内容是注释，建议填写自己的邮箱</p>
<p>创建过程中会询问是否创建口令，视自身需求是否创建</p>
<pre><code>cd ~/.ssh
cat id_rsa.pub
</code></pre>
<p>创建完毕后，进入到ssh的目录，查看id_rsa.pub中的ssh公钥，并复制打印的内容</p>
<p><img src="articles/rust-aur/articles/rust-aur/cat_ssh_pub_key.png" alt="" /></p>
<p>进入AUR的账号设置，将这串内容填入SSH公钥一栏</p>
<p><img src="articles/rust-aur/articles/rust-aur/add_ssh_key_to_AUR.png" alt="" /></p>
<p>将SSH公钥粘贴进去，并在底下输入当前密码，保存修改</p>
<h1 id="cargo-aur"><a class="header" href="#cargo-aur">cargo-aur</a></h1>
<p>AUR中 PKGBUILD 和 .SRCINFO 两个文件分别包含了包的构建信息和包的元属性，我们将使用cargo-aur来生成这两个文件</p>
<p>cargo-aur是一个Rust项目的打包工具，它会自动将你的Rust项目打包成AUR的格式，并且根据Cargo.toml的内容，生成相关文件，所以我们不需要手动编写相关文件</p>
<p>通过cargo安装</p>
<pre><code>cargo install cargo-aur
</code></pre>
<p>通过AUR安装</p>
<pre><code>yay -S cargo-aur-bin
</code></pre>
<p>安装之后，你就可以使用cargo aur这个命令</p>
<h1 id="打包"><a class="header" href="#打包">打包</a></h1>
<p>首先你得有一个你将要打包的存储在git仓库中的Rust项目，并且已经远程连接到某个代码托管网站，最好清空了commit</p>
<p>由于cargo aur会根据你的Cargo.toml文件生成AUR的相关文件，所以你需要将Cargo.toml的相关属性填写完整，不然打包的时候会报错，缺少字段</p>
<p>你的项目可能依赖了一些arch的包，可以在Cargo.toml中写明</p>
<pre><code>[package.metadata.aur]
depends = [&quot;nachos&quot;, &quot;pizza&quot;] # 必要依赖
optdepends = [&quot;sushi&quot;, &quot;ramen&quot;] # 可选依赖
</code></pre>
<p>万事具备，进入到你要打包的crate的根目录，现在开始打包</p>
<pre><code>cargo aur
</code></pre>
<p>完成之后，在target/cargo-aur目录下有两个文件，一个名为PKGBUILD的文件，一个名为
<code>&lt;包名&gt;-&lt;版本号&gt;-&lt;目标架构&gt;.tar.gz</code>
的tar包</p>
<p>有关这个包的元数据保存在一个名为 .SRCINFO 的文件中，这个文件需要我们自己用命令生成</p>
<p>进入到target/cargo-aur目录运行以下命令，生成 .SRCINFO文件</p>
<pre><code>makepkg --printsrcinfo &gt; .SRCINFO
</code></pre>
<p>由于这个文件是默认隐藏的，所以你直接用ls命令是不能查看的</p>
<p>为了验证你的包能不能顺利安装，你可以直接运行</p>
<pre><code>makepkg
</code></pre>
<p>在你的系统上安装这个包</p>
<p>如果一切顺利，你可以看到以下信息</p>
<pre><code>==&gt; Finished making: &lt;包名&gt; &lt;版本&gt; (&lt;时间&gt;)
</code></pre>
<p>并且 pkg/&lt;包名&gt; 这个目录会被创建，你可以在里面找到这个包的可执行文件，你可以尝试运行这个可执行文件看看能不能正常工作</p>
<h1 id="上传"><a class="header" href="#上传">上传</a></h1>
<p>AUR中不会存储完整的包，只会存储这个包的信息，当你从AUR安装这个包的时候，你会先下载这个包的有关信息，然后根据这些信息再去其他地方下载完整的包</p>
<p>PKGBUILD 和 .SRCINFO 就保存着这个包的相关信息，tar包则是完整的包</p>
<p>所以你需要将 PKGBUILD 和 .SRCINFO 上传到AUR，然后tar包找一个地方存储</p>
<p>cargo-aur要求你将tar包发布到你所远程连接的仓库的发行版中，为了方便国内用户，我上传到了gitee</p>
<p><img src="articles/rust-aur/articles/rust-aur/gitee_release.png" alt="" /></p>
<p><em>注意，这个仓库必须是public的，并且版本号一定要和Cargo.toml中的版本号一致</em></p>
<p>当用户从AUR安装时，便会自动从gitee下载最新的发行版并构建</p>
<p>接下来你要将PKGBUILD上传到AUR</p>
<p>请注意，cargo-aur生成的AUR包的名字叫做&lt;Rust包名&gt;-bin，表明这是某个包的二进制版本，而不是从源码构建的版本</p>
<p>那么你要在AUR上创建一个对应的包</p>
<pre><code>git clone ssh://aur@aur.archlinux.org/包名-bin.git
</code></pre>
<p>通过这个命令，直接clone对应的AUR包，如果这个包不存在，AUR会你自动创建一个空的包</p>
<p>（由于是通过ssh下载，如果你在ssh密钥中创建了口令，那么它就会询问这个口令）</p>
<p>现在将上面生成的 PKGBUILD 和 .SRCINFO 文件复制到clone下来的仓库中</p>
<p>通过以下git命令上传</p>
<p>另外，似乎AUR只允许主分支叫 master , 而不能叫其他名字， 如果你的主分支不叫master， 先将主分支重命名为master</p>
<pre><code>git add PKGBUILD .SRCINFO
git commit -m &quot;Released version: &lt;version_name&gt;&quot;
git push origin master
</code></pre>
<p>如果一切顺利，你就可以在AUR上找到你的包了</p>
<p><img src="articles/rust-aur/articles/rust-aur/AUR_uploaded_package.png" alt="" /></p>
<p>然后你就可以尝试使用AUR helper安装你的包了</p>
<p>包上传之后可能不会立即生效</p>
<p>附一张成功的截图</p>
<p><img src="articles/rust-aur/articles/rust-aur/yay_succeed.png" alt="" /></p>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->


                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">

            </nav>

        </div>




        <script>
            window.playground_copyable = true;
        </script>


        <script src="elasticlunr.min.js"></script>
        <script src="mark.min.js"></script>
        <script src="searcher.js"></script>

        <script src="clipboard.min.js"></script>
        <script src="highlight.js"></script>
        <script src="book.js"></script>

        <!-- Custom JS scripts -->

        <script>
        window.addEventListener('load', function() {
            window.setTimeout(window.print, 100);
        });
        </script>

    </div>
    </body>
</html>
